/**
* 
* 
*  
*====================================================
* 文件名称: DateTimeFormatInterceptor.java
* 修订记录：
* No    日期				作者(操作:具体内容)
* 1.    2009-7-7			
*====================================================
* 类描述：(说明未实现或其它不应生成javadoc的内容)
* 
*/
package com.devframe.web.interceptors;



import org.apache.commons.beanutils.PropertyUtils;
import org.apache.log4j.Logger;

import com.devframe.sys.util.common.DateUtils;
import com.devframe.web.MyAction;
import com.devframe.web.MyContext;
import com.opensymphony.xwork2.util.ValueStack;

/**
 *<pre><b><font color="blue">DateTimeFormatInterceptor</font></b></pre>
 *
 *<pre><b>&nbsp;--日期时间格式自动转换--</b></pre>
 * <pre>
 *    在form中提交后到后台自动转成存储格式
 *    在转到页面显示时自动转成显示格式
 *    由于对与持久化对象进行修改可能导致被提交（如记录操作日志时会提交事务，导致一并提交），
 *    取消对持久化对象的显示格式转换支持，即带“.”的表达式将不支持显示的转，请使用页面标签进行转换输出。
 *    
 * </pre>
 * <pre>
 * <b>--样例--</b>
 *   DateTimeFormatInterceptor obj = new DateTimeFormatInterceptor();
 *   obj.method();
 * </pre>
 * JDK版本：JDK1.4
 * @author  <b></b> 
 */
public class DateTimeFormatInterceptor implements MyInterceptor{

	/**
     * logger
     */
    private Logger logger = Logger.getLogger(DateTimeFormatInterceptor.class);

    /**
     * 返回页面时转换成显示格式，如YYYY-MM-DD格式
     * @param context 上下文
     * @param action action类
     * @param actionResult actionResult
     * 
     */
    public void after(MyContext context, MyAction action,Object actionResult) {
        if(!(action instanceof DateTimeFormatAware)) {
            return;
        }
        //避免因为转变格式可能导致不必要的UPDATE操作问题，如果查询页面有记录操作日志会产生这种情况。
        DateTimeFormatAware ac = (DateTimeFormatAware) action;
        String[] fields = ac.getDateTimeFields();
        //日期格式处理为显示格式****************************************************************
        if (fields != null) {
            for (int i = 0; i < fields.length; i++) {
                //为避免持久化对象被修改并提交，屏蔽对嵌套属性的显示值的转换支持
                if(fields[i].indexOf(".")>0) {
                    //logger.error("为避免持久化对象被修改并提交，屏蔽对嵌套属性的显示值的转换支持。");
                    //logger.error(action.getClass().getName()+":"+fields[i]);
                    continue;
                }
                try {
                    Object value = getProperty(action, fields[i]);
                    if(value == null ){
                        continue;
                    }
                    if(value instanceof String[]){//数组则循环处理
                        String[] strVals = (String[]) value;
                        for(int j=0;j<strVals.length;j++){
                            strVals[j] = DateUtils.toDisplayStr(strVals[j], DateUtils.HYPHEN_DISPLAY_DATE);
                        }
                        setProperty(action, fields[i], strVals);
                    } else{//单值则直接格式化
                        String strVal = (String) value;
                        strVal = DateUtils.toDisplayStr(strVal, DateUtils.HYPHEN_DISPLAY_DATE);
                        setProperty(action, fields[i], strVal);
                    }
                } catch (Exception ex) {
                    logger.info("error when convert " + fields[i] + " to display format.");
                    //throw new PreInterceptorException(ex.getMessage(), ex);
                }
            }
        }
    }
    private void setValueStackVal(ValueStack valueStack,String fileName,Object value){
    	Object val=valueStack.findValue(fileName);
    	if(val!=null){
    		valueStack.setValue(fileName, value);
    		
    	}else{
    		valueStack.set(fileName, value);
    	}
    }
	public void after(MyContext context, MyAction action, ValueStack valueStack,Object actionResult) {
        if(!(action instanceof DateTimeFormatAware)) {
            return;
        }
        DateTimeFormatAware ac = (DateTimeFormatAware) action;
        String[] fields = ac.getDateTimeFields();
        //日期格式处理为显示格式****************************************************************
        if (fields != null) {
            for (int i = 0; i < fields.length; i++) {
                //为避免持久化对象被修改并提交，屏蔽对嵌套属性的显示值的转换支持
                if(fields[i].indexOf(".")>0) {
                    //logger.error("为避免持久化对象被修改并提交，屏蔽对嵌套属性的显示值的转换支持。");
                    //logger.error(action.getClass().getName()+":"+fields[i]);
                    continue;
                }
                try {
                    Object value = getProperty(action, fields[i]);
                    if(value == null ){
                        continue;
                    }
                    if(value instanceof String[]){//数组则循环处理
                        String[] strVals = (String[]) value;
                        for(int j=0;j<strVals.length;j++){
                            strVals[j] = DateUtils.toDisplayStr(strVals[j], DateUtils.HYPHEN_DISPLAY_DATE);
                        }
                       // setValueStackVal(valueStack, fields[i], strVals);
                       // context.setRequestAttribute(fields[i], strVals);
                        setProperty(action, fields[i], strVals);
                    } else{//单值则直接格式化
                        String strVal = (String) value;
                        strVal = DateUtils.toDisplayStr(strVal, DateUtils.HYPHEN_DISPLAY_DATE);
                       // setValueStackVal(valueStack, fields[i], strVal);
                        setProperty(action, fields[i], strVal);
                       // context.setRequestAttribute(fields[i], strVal);
                    }
                } catch (Exception ex) {
                    logger.info("error when convert " + fields[i] + " to display format.");
                    //throw new PreInterceptorException(ex.getMessage(), ex);
                }
                
                
            }
        } 
        
	}

    /**
     * getActionProperty 支持嵌套的属性获取
     * @param object object
     * @param field field
     * @return object
     * @throws Exception Exception
     * 
     */
    private Object getProperty(Object object,String field) throws Exception{
        if(field.indexOf(".")>0){
            String p1 = field.substring(0, field.indexOf("."));
            String p2 = field.substring(field.indexOf(".")+1);
            Object obj = PropertyUtils.getProperty(object, p1);
            return getProperty(obj, p2);
        } else {
            return PropertyUtils.getProperty(object, field);
        }
    }
    
    /**
     * setActionProperty 支持嵌套的属性设置
     * @param object object
     * @param field field
     * @param value value
     * @throws Exception Exception
     * 
     */
    private void setProperty(Object object,String field,Object value) throws Exception{
        if(field.indexOf(".")>0){
            String p1 = field.substring(0, field.indexOf("."));
            String p2 = field.substring(field.indexOf(".")+1);
            Object obj = PropertyUtils.getProperty(object, p1);
            setProperty(obj, p2, value);
        } else {
            PropertyUtils.setProperty(object, field,value);
        }
    }

    /**
     * 进行数据处理前转换为存储格式
     * @param context 上下文
     * @param action action类
     * 
     */
    public void before(MyContext context, MyAction action) {
        if(!(action instanceof DateTimeFormatAware)) {
            return;
        }
        DateTimeFormatAware ac = (DateTimeFormatAware) action;
        String[] fields = ac.getDateTimeFields();
        //日期格式处理为存储格式****************************************************************
        if (fields != null) {
            for (int i = 0; i < fields.length; i++) {
                try {
                    Object value = getProperty(action, fields[i]);
                    if(value == null ){
                        continue;
                    }
                    if(value instanceof String[]){//数组则循环处理
                        String[] strVals = (String[]) value;
                        for(int j=0;j<strVals.length;j++){
                            strVals[j] = DateUtils.toStoreStr(strVals[j]);
                        }
                        setProperty(action, fields[i], strVals);
                    } else{//单值则直接格式化
                        String strVal = (String) value;
                        strVal = DateUtils.toStoreStr(strVal);
                        setProperty(action, fields[i], strVal);
                    }
                } catch (Exception ex) {
                    logger.error("error when convert "+fields[i] +" to store format.");
                    //throw new PreInterceptorException(ex.getMessage(), ex);
                }
            }
        }
    }

}
